package com.zhenfan.pattern.lazy;

/**
 * 懒汉式
 *
 * @author wangmh
 * @create 2018-10-29 16:42
 **/
public class Lazy {

    private static Lazy instance;

    private Lazy() {}

    /**
     * <pre>
     *     普通单例
     *     安全性：不安全
     * </pre>
     * @return
     */
    public static Lazy getInstance() {
        // 如果未初始化，则初始化
        if (instance == null) {
            instance = new Lazy();
        }
        return instance;
    }

    /**
     * <pre>
     *     加锁实现单例
     *     安全性：安全，并发速度慢
     * </pre>
     */
    public synchronized static Lazy getInstance2() {
        // 如果未初始化，则初始化
        if (instance == null) {
            instance = new Lazy();
        }
        return instance;
    }

    /**
     * <pre>
     *     双重判空加锁获取单例
     *     安全性：安全，并发速度较快
     * </pre>
     * @return
     */
    public static Lazy getInstance3() {
        if (instance == null) {
            synchronized (Lazy.class) {
                if (instance == null) {
                    instance = new Lazy();
                }
            }
        }
        return instance;
    }

    /**
     * <pre>
     *     通过内部类获取单例，内部类在加载时才会初始化
     *     final 防止方法被重写或重载
     *     static 是单例共享
     *     安全性：安全
     * </pre>
     *
     */
    public static final Lazy getInstance4() {
        return InnerLay.lazy;
    }

    private static class InnerLay {

        private static Lazy lazy = new Lazy();
    }
}
